#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <stdlib.h>
#include <unistd.h>

typedef unsigned int uint;
#define CADATEMAX  32

//注册
#define REGIST_OK "regist ok"
#define REGIST_FALIED "regist failed : name existed"
//登录
#define LOGIN_OK "login ok"
#define LOGIN_FALIED "login failed : name error or pwd error or relogin"
//搜索
#define SEARCH_USR_NO "No such people"
#define SEARCH_USR_ONLINE "Online"
#define SEARCH_USR_OFFLINE "Offline"
//添加好友
// #define ADD_USR_ALREADY  "Already a friend"
#define ADD_USR_fAILED "Failed to add"
#define ADD_USR_SUCCESSFUL  "Add friend successful"
//添加好友回复
#define UNKNOW_ERROR "unknow error"
#define EXISTED_FRIEND "friend exist"
#define ADD_FRIEND_OFFINE "usr offline"
#define ADD_FRIEND_ON_EXIST "usr not exist"
//删除好友
#define DELETE_SUCCESSFUL "delete successfully"
#define DELETE_FALURE "delete falure"
//创建文件夹
#define CREATE_DIR_SUCCESSFUL "create dir successful"
#define CREATE_DIR_NO_EXIST "create dir not exist"
#define CREATE_DIR_NAME_EXIST "create dir name exist"
//删除文件夹
#define DELETE_DIR_OK "delete dir successful"
#define DELETE_DIR_FAILED "delete dir failuered: is file"
//删除文件
#define DELETE_FILE_OK "delete file successful"
#define DELETE_FILE_FAILED "delete file failuered: is dir"
//重命名
#define RENAME_OK "rename  successful"
#define RENAME_FAILED "rename failuered"
//进入文件夹
#define ENTER_DIR_OK "进入成功"
#define ENTER_DIR_FAILED "这是一个文件不是文件夹！"
//上传文件
#define UPLOAD_DIR_CREATE_OK "上传文件--创建新文件成功"
#define UPLOAD_DIR_CREATE_FAILED "上传文件--创建新文件失败或者文件已经存在"
#define UPLOAD_DIR_FINISHED "上传文件完成"
#define UPLOAD_DIR_PROGRESS "上传进度"
//回复情况
enum HREST{
    S_OK,
    S_FALSE,
    S_EFILE,
    S_UNKOW
};
//协议
enum MSGTYPE{
    LOGINER,        //登录
    REGISTER,       //注册

    ADD_USRER,     //添加用户
    DELETE_USRER,   //删除用户

    ADD_FILE,       //添加文件
    DELETE_FILE,    //删除文件
    RENAME_FILE,    //重命名文件

    ADD_DIR,        //添加文件夹
    DELETE_DRE,     //删除文件夹
    RENAME_DIR,     //重命名文件夹
};


struct PDU
{
    uint uiPDULen;  //总的协议数据单元大小
    uint uiMsgType;     //消息类型
    char caData[CADATEMAX];
    uint uiMsgLen;  //实际消息长度
    char caMsg[];    //实际消息
};

struct FileInfo
{
    char caFileName[CADATEMAX]; //文件名字
    uint fileNameLen;
    int isFileType; //文件类型
};

enum ENUM_MSG_TYPE
{
    ENUM_MSG_TYPE_MIN=0,
    //登录注册
    ENUM_MSG_TYPE_REGIST_REQUEST,   //注册请求
    ENUM_MSG_TYPE_REGIST_RESPOND,   //注册回复

    ENUM_MSG_TYPE_LOGIN_REQUEST,   //登录请求
    ENUM_MSG_TYPE_LOGIN_RESPOND,   //登录回复
    //好友请求
    ENUM_MSG_TYPE_ALL_ONLINE_REQUEST,   //在线用户请求
    ENUM_MSG_TYPE_ALL_ONLINE_RESPOND,   //在线用户回复

    ENUM_MSG_TYPE_SERACH_USR_REQUEST,   //搜索用户请求
    ENUM_MSG_TYPE_SERACH_USR_RESPOND,   //搜索用户回复

    ENUM_MSG_TYPE_ADD_FRIEND_REQUEST,   //添加用户请求
    ENUM_MSG_TYPE_ADD_FRIEND_RESPOND,   //添加用户回复

    ENUM_MSG_TYPE_ADD_FRIEND_AGREE,   //同意添加好友
    ENUM_MSG_TYPE_ADD_FRIEND_REFUSE,   //拒绝添加好友

    ENUM_MSG_TYPE_FLUSH_FRIEND_REQUEST,   //刷新好友请求
    ENUM_MSG_TYPE_FLUSH_FRIEND_RESPOND,   //刷新好友回复

    ENUM_MSG_TYPE_DELETE_FRIEND_REQUEST,   //删除好友请求
    ENUM_MSG_TYPE_DELETE_FRIEND_RESPOND,   //删除好友回复

    ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST,   //私聊请求
    ENUM_MSG_TYPE_PRIVATE_CHAT_RESPOND,   //私聊回复

    ENUM_MSG_TYPE_GROUP_CHAT_REQUEST,   //群聊请求
    ENUM_MSG_TYPE_GROUP_CHAT_RESPOND,   //群聊回复
    //Book文件请求
    ENUM_MSG_TYPE_CREATE_DIR_REQUEST,   //创建文件夹请求
    ENUM_MSG_TYPE_CREATE_DIR_RESPOND,   //创建文件夹回复

    ENUM_MSG_TYPE_REBACK_DIR_REQUEST,   //返回文件夹请求
    ENUM_MSG_TYPE_REBACK_DIR_RESPOND,   //返回文件夹回复

    ENUM_MSG_TYPE_ENTER_DIR_REQUEST,   //进入文件夹请求
    ENUM_MSG_TYPE_ENTER_DIR_RESPOND,   //进入文件夹回复

    ENUM_MSG_TYPE_FLUSH_FILE_REQUEST,   //刷新文件夹请求
    ENUM_MSG_TYPE_FLUSH_FILE_RESPOND,   //刷新文件夹回复

    ENUM_MSG_TYPE_DELETE_DIR_REQUEST,   //删除文件夹请求
    ENUM_MSG_TYPE_DELETE_DIR_RESPOND,   //删除文件夹回复

    ENUM_MSG_TYPE_DELETE_FILE_REQUEST,   //删除文件请求
    ENUM_MSG_TYPE_DELETE_FILE_RESPOND,   //删除文件回复

    ENUM_MSG_TYPE_RENAME_DIR_REQUEST,   //重新命名文件夹请求
    ENUM_MSG_TYPE_RENAME_DIR_RESPOND,   //重新命名文件夹回复

    ENUM_MSG_TYPE_SHARE_FILE_REQUEST,   //共享文件请求
    ENUM_MSG_TYPE_SHARE_FILE_RESPOND,   //共享文件回复
    ENUM_MSG_TYPE_SHARE_FILE_NOTE,   //共享文件通知
    ENUM_MSG_TYPE_SHARE_FILE_NOTE_RESPOND,   //共享文件通知回复

    ENUM_MSG_TYPE_DOWNLOAD_DIR_REQUEST,   //下载文件夹请求
    ENUM_MSG_TYPE_DOWNLOAD_DIR_RESPOND,   //下载文件夹回复

    ENUM_MSG_TYPE_UPLOAD_DIR_REQUEST,   //上传文件夹请求
    ENUM_MSG_TYPE_UPLOAD_DIR_RESPOND,   //上传文件夹回复
    ENUM_MSG_TYPE_MOVE_FILE_REQUEST,   //移动文件请求
    ENUM_MSG_TYPE_MOVE_FILE_RESPOND,   //移动文件回复

    ENUM_MSG_TYPE_MAX=0x00ffffff,
};

PDU *mkPDU(uint uiMsgLen);

#endif // PROTOCOL_H
